/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.pages;

import com.tida.servir.base.GeneralPage;
import com.tida.servir.entities.*;
import helpers.Encriptacion;
import helpers.Helpers;
import helpers.PasswordGenerator;
import helpers.SMTPConfig;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.List;
import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.Response;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author ale
 */
public class RespuestaSolicitud extends GeneralPage {

    @Property
    @SessionState
    private Entidad eue;
    @Inject
    private Session session;
    @Inject
    private PropertyAccess _access;
    @Inject
    private Request _request;
    @PageActivationContext
    private Solicitud_Acceso nuevasolicitud;
//    @Property
//    @Persist
//    private Funcionario funcionario;
    @Property
    @Persist
    private String fecharesolu;
    @Property
    @Persist
    private DatoAuxiliar bdocumentoidentidad;
    @Property
    @Persist
    private Boolean vaprobar;
    //variables para el popup rechazar
    @Property
    @Persist
    private boolean mostrarPopUpRechazar;
    @Property
    @Persist
    private boolean bRechazoDefinitivo; //la opcion por default de popup rechazar es rechazo definitivo
    @Property
    @Persist
    private String sObservacionRechazo;
    @Property
    @Persist
    private boolean mostrarModalConfirmarBaja;
    @InjectComponent
    private Zone confirmarBajaZone;
    @InjectComponent
    private Zone rechazarZone;
    @Property
    @Persist
    private Usuario usuarioDarBaja;
    @SessionState
    private Usuario loggedUser;
    @Persist
    private List<LkBusquedaPerfilEntidad> listaAdmin;
    @Property
    @Persist
    private Usuario usuarioSolicitud;
    
    @Inject
    PageRenderLinkSource linkSource;

    @Log
    public Solicitud_Acceso getNuevasolicitud() {
        return nuevasolicitud;
    }

    public void setnNevasolicitud(Solicitud_Acceso nuevasolicitud) {
        this.nuevasolicitud = nuevasolicitud;
    }

    // inicio de la pagina
    @SetupRender
    void initValues() {
        usuarioSolicitud = (Usuario) session.load(Usuario.class, getUsuarios(null, nuevasolicitud.getId(), null).get(0).getId());
        //funcionario = (Funcionario) session.load(Funcionario.class, nuevasolicitud.getId());
        SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
        fecharesolu = formatoDeFecha.format(nuevasolicitud.getFec_resolucion());
        bdocumentoidentidad = nuevasolicitud.getDocumentoidentidad();

//        if ( getUsuarios( nuevasolicitud.getTrabajador().getId(),null ).size() > 0 )
//        {
//            if ( getAllPerfiles( getUsuarios( nuevasolicitud.getTrabajador().getId(),null ).get(0).getId() ).size() > 0 )
//            {
//                vaprobar    = true;
//            }
//        }

        //valores para el popup de rechazar
        //por default el rechazo sera definitivo
        mostrarPopUpRechazar = false;
        bRechazoDefinitivo = true;
        mostrarModalConfirmarBaja = false;
    }

    @Log
    public List<LkBusquedaPerfilEntidad> getUsuarioAdministrador(Long entidadID) {
        Criteria criterio = session.createCriteria(LkBusquedaPerfilEntidad.class);
        criterio.add(Restrictions.eq("estadousuario", 1L));
        criterio.add(Restrictions.eq("entidadid", entidadID));
        criterio.add(Restrictions.eq("perfilid", 3L));
        return criterio.list();
    }

    @Log
    public List<Perfilporusuario> getAllPerfiles(long usuid) {
        List<Perfilporusuario> lista = null;
        Criteria c = session.createCriteria(Perfilporusuario.class);
        c.add(Restrictions.eq("usuarioId", usuid));
//        Query query = session.getNamedQuery("Perfilporusuario.findByUsuarioId");
//        query.setParameter("usuarioId", usuid);
//        query.setParameter("perfilId", long(9)));
        c.add(Restrictions.in("perfilId", new Long[]{9L, 10L}));
//        lista = query.list();

        return c.list();
    }

    @Log
    public com.tida.servir.services.GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("DOCUMENTOIDENTIDAD", null, 0, session);
        return new com.tida.servir.services.GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    public com.tida.servir.services.GenericSelectModel<Perfil> getBeanperfil() {
        List<Perfil> list;
        Criteria c = session.createCriteria(Perfil.class);
        c.add(Restrictions.in("id", new Long[]{3L, 5L, 6L}));
        list = c.list();
        return new com.tida.servir.services.GenericSelectModel<Perfil>(list, Perfil.class, "descperfil", "id", _access);
    }

    @Log
    @CommitAfter
    Object onSuccessFromformAltasolicitud() {
        if (num2 == 2) {
            mostrarPopUpRechazar = true;
            mostrarModalConfirmarBaja = false;
            num2 = 1;
            return new MultiZoneUpdate("rechazarZone", rechazarZone.getBody());
        } else {
            mostrarModalConfirmarBaja = false;

            if (nuevasolicitud.getPerfil().getId() == 3) {
                listaAdmin = getUsuarioAdministrador(usuarioSolicitud.getEntidad().getId());
                if (listaAdmin.size() > 0) {
                    System.out.println("aquiiiiiiiiiiii");
                    mostrarModalConfirmarBaja = true;
                    usuarioDarBaja = (Usuario) session.load(Usuario.class, listaAdmin.get(0).getUsuarioid());
                    return new MultiZoneUpdate("confirmarBajaZone", confirmarBajaZone.getBody()).add("rechazarZone", rechazarZone.getBody());
                }
                aprobarSolicitud();
                return "Alerta";
            }
            aprobarSolicitud();
            return "Alerta";
        }
    }
    
    @Persist
    private int num2;

    // seleccion del boton
    void onSelectedFromRechazar() {
        num2 = 2;
        sObservacionRechazo = null;
    }

    @Log
    protected void aprobarSolicitud() {
        helpers.Logger logger = new helpers.Logger();

        String sClaveGenerada;
        sClaveGenerada = PasswordGenerator.getPassword(PasswordGenerator.MINUSCULAS
                + PasswordGenerator.MAYUSCULAS + PasswordGenerator.NUMEROS, 6);

        System.out.println("antesss");
        usuarioSolicitud.setEstado(1L);
        usuarioSolicitud.setMd5Clave(Encriptacion.MD5(sClaveGenerada));
        session.saveOrUpdate(usuarioSolicitud);
        session.flush();
        System.out.println("despuess" + usuarioSolicitud.getEstado());

        Perfilusuario permiso = new Perfilusuario();
        PerfilusuarioPK perfilusuariopk = new PerfilusuarioPK();
        perfilusuariopk.setUsuarioId(usuarioSolicitud.getId());
        perfilusuariopk.setPerfilId(nuevasolicitud.getPerfil().getId());
        permiso.setPerfilusuarioPK(perfilusuariopk);
        session.saveOrUpdate(permiso);

//        List<UsuarioTrabajador> listUsuarios = getUsuarios(nuevasolicitud.getId(), null, usuarioSolicitud.getId());
//        listaAdmin = getUsuarioAdministrador(usuarioSolicitud.getEntidad().getId());
//        for (int i = 0; i < listaAdmin.size(); i++) {
//            Usuario usuario = (Usuario) session.load(Usuario.class, listaAdmin.get(i).getUsuarioid());
//            usuario.setEstado(0L);
//            session.saveOrUpdate(usuario);
//            session.flush();
//        }

        String hql = "update RNSDD_EVENTO set estadoevento = 1 where tipoevento_id='"
                + logger.SOLICITUD_SANCION + "' and tabla_id='" + nuevasolicitud.getId()
                + "' and estadoevento = 0";
        Query query = session.createSQLQuery(hql);
        int rowCount = query.executeUpdate();
        session.flush();

        //envio de correo 
        ConfiguracionAcceso ca = (ConfiguracionAcceso) session.load(ConfiguracionAcceso.class, 1L);
        String sAsuntoEmail;
        StringBuilder sbDetalleEmail;
        sAsuntoEmail = "Solicitud de Acceso Aprobada - Servir";

        sbDetalleEmail = new StringBuilder();
        sbDetalleEmail.append( "Estimado(a)<br/>" );
        sbDetalleEmail.append( nuevasolicitud.getNombres());
        sbDetalleEmail.append( " ");
        sbDetalleEmail.append( nuevasolicitud.getApellidoPaterno());
        sbDetalleEmail.append( " ");
        sbDetalleEmail.append( nuevasolicitud.getApellidoMaterno()+ "<br/><br/>");
        sbDetalleEmail.append( "Mediante el presente se le comunica que el siguiente personal se encuentra habilitado para el acceso al RNSDD, a fin de que pueda realizar las consultas y/o inscripciones que correspondan:<br/><br/>");
        sbDetalleEmail.append( "Usuario: " + nuevasolicitud.getNroDocumento() + "<br/>" );            
        sbDetalleEmail.append( "Clave: " + sClaveGenerada + " <br/><br/>" );
        sbDetalleEmail.append( "Se recomienda anotar la contraseña a fin de poder recordarlo, tenga en cuenta que el sistema diferencia entre minúsculas y mayúsculas.<br/>" );
        sbDetalleEmail.append( "Atte.<br/><br/>" );
        sbDetalleEmail.append( "<b>Gerencia de Desarrollo del Sistema de Recursos Humanos.</b><br/>" );
        sbDetalleEmail.append( "<b>Autoridad Nacional del Servicio Civil - SERVIR.</b><br/>" );

        if (SMTPConfig.sendMail(sAsuntoEmail, sbDetalleEmail.toString(), nuevasolicitud.getEmail(), ca)) {
            System.out.println("Envío Correcto");
        } else {
            logger.loguearEvento(session, logger.ERROR_SERVIDOR_DE_CORREO, usuarioSolicitud.getEntidad().getId(), nuevasolicitud.getId(), loggedUser.getId(), logger.CORREO_FAIL_RESET_PASSWORD, 0);
        }
    }

    @Log
    @CommitAfter
    Object onSuccessFromformRechazarSolicitud() {
        //envio de correo 
        ConfiguracionAcceso ca = (ConfiguracionAcceso) session.load(ConfiguracionAcceso.class, 1L);
        String sAsuntoEmail;
        StringBuilder sbDetalleEmail = new StringBuilder();
        Encriptacion encripta = new Encriptacion();
        String sLinkEditarSolicitud = linkSource.createPageRenderLinkWithContext("SolicitudAcceso", encripta.MD5(Long.toString(nuevasolicitud.getId()))).toAbsoluteURI();
        if (bRechazoDefinitivo) {
            sAsuntoEmail = "Solicitud de Acceso Rechazada - Servir";
            sbDetalleEmail.append("Su solicitud ha sido rechazada debido a: <br/><br/>" + sObservacionRechazo);
            usuarioSolicitud.setEstado(5L);
            nuevasolicitud.setEstado(5);
        } else {   //se observa la solicitud de acceso
            sAsuntoEmail = "Solicitud de Acceso Observada - Servir";
            sbDetalleEmail.append("Su solicitud ha sido observada debido a: <br/><br/><quote>" + sObservacionRechazo + "</quote><br/><br/>");
            sbDetalleEmail.append("Ingrese al siguiente link: <br/><br/> ");
            sbDetalleEmail.append("<a href="+sLinkEditarSolicitud+" target='_blank'>"+sLinkEditarSolicitud+"</a>");
            usuarioSolicitud.setEstado(4L);
            nuevasolicitud.setEstado(4);
        }

        if (SMTPConfig.sendMail(sAsuntoEmail, sbDetalleEmail.toString(), nuevasolicitud.getEmail(), ca)) {
            System.out.println("Envío Correcto");
        } else {
            helpers.Logger logger = new helpers.Logger();
            //TO-DO enviar los parametros correctos
            logger.loguearEvento(session, logger.ERROR_SERVIDOR_DE_CORREO, usuarioSolicitud.getEntidad().getId(), usuarioSolicitud.getId(), loggedUser.getId(), logger.CORREO_FAIL_RESET_PASSWORD, 0);
        }
        nuevasolicitud.setDes_observacion(sObservacionRechazo);
        usuarioSolicitud.setObservacion(sObservacionRechazo);
        session.saveOrUpdate(nuevasolicitud);
        session.flush();
        session.saveOrUpdate(usuarioSolicitud);
        session.flush();

        helpers.Logger logger = new helpers.Logger();
        //TO-DO
        //cambio del estado del evento...
        String hql = "update RNSDD_EVENTO set estadoevento = 1 where tipoevento_id='"
                + logger.SOLICITUD_SANCION + "' and tabla_id='" + nuevasolicitud.getId()
                + "' and estadoevento = 0";
        Query query = session.createSQLQuery(hql);
        int rowCount = query.executeUpdate();
        session.flush();

        return "Alerta";
    }

    @Log
    public List<UsuarioTrabajador> getUsuarios(Long trabaid, Long solicitudid, Long usuarioid) {
        Criteria c = session.createCriteria(UsuarioTrabajador.class);
//        if (trabaid != null) {
//            c.add(Restrictions.eq("trabajadorid", trabaid));
//        }
        if (solicitudid != null) {
            c.add(Restrictions.eq("solicitudid", solicitudid));
        }
        if (usuarioid != null) {
            c.add(Restrictions.ne("id", usuarioid));
        }
        return c.list();
    }

    Object onCancel() {
        return "Alerta";
    }

    @Log
    @CommitAfter
    Object onSuccessFromformConfirmarBaja() {
        aprobarSolicitud();
        usuarioDarBaja.setEstado(0L);
        session.saveOrUpdate(usuarioDarBaja);
        session.flush();
        mostrarModalConfirmarBaja = false;
        return "Alerta";
    }

    StreamResponse onActionFromReturnStreamResponse() {
        return new StreamResponse() {
            InputStream inputStream;
            File fileADescargar = new File(nuevasolicitud.getDocumento());

            @Override
            public void prepareResponse(Response response) {

                System.out.println(fileADescargar);

                try {
                    inputStream = new FileInputStream(fileADescargar);
                } catch (FileNotFoundException ex) {
//                        Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, ex);
                }

                try {
                    response.setContentLength(inputStream.available());
                    response.setHeader("Content-Disposition", "inline;filename=" + fileADescargar.getName());
                } catch (Exception e) {
//                        Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, e);
                }
            }

            @Override
            public String getContentType() {
                if (extension().toUpperCase().equals("PDF")) {
                    return "application/pdf";
                }
                if (extension().toUpperCase().equals("JPG")) {
                    return "image/jpeg";
                } else {
                    return "application/msword";
                }
            }

            @Override
            public InputStream getStream() throws IOException {
                return inputStream;
            }

            public String extension() {
                int dot = fileADescargar.getName().lastIndexOf(".");
                return fileADescargar.getName().substring(dot + 1);
            }
        };
    }
}
